package vista;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;

import java.util.Observable;
import java.util.Observer;
import javax.swing.JTextArea;

import javax.swing.JPanel;
import javax.swing.border.Border;

import negModel.Auto;
import negModel.Modelo;
import controlador.Controlador;
import controlador.ControladorDeVentanas;
import java.awt.Dimension;



public class VistaCarrera extends JFrame implements Observer{

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	
	private JPanel panelDatos = null;
	private PanelPista VistaJugador = null;
	private PanelPista VistaOponente = null;
	private VistaDatos vistaDatos = null;
	private Modelo modelo;
	private Controlador controlador;
	private ControladorDeVentanas contVent;
	
	
	
	private static class CloseListener extends WindowAdapter{
		
		private ControladorDeVentanas contVent;
		private Modelo modelo;
		
		
		public CloseListener(ControladorDeVentanas contVent,Modelo modelo){
			this.contVent=contVent;
			this.modelo=modelo;
		}
		
		public void windowClosing(WindowEvent e){
			e.getWindow().dispose();
			modelo.terminarCarrera();
			if (modelo.getCarreraActual().getGanador())
						modelo.SumarPremio();
			else
						modelo.DescontarPremio();
			
			contVent.ActualizarDinero();
			contVent.ActualizarVistaTallerAutos();
			contVent.ActualizarVistaTallerPartes();
			contVent.AbrirVentanaTaller();
			}
	}
	
	/**
	 * This is the default constructor
	 */
	public VistaCarrera(Modelo modelo,Controlador controlador,ControladorDeVentanas contVent) {
		super();
		
		this.controlador = controlador;
		this.modelo = modelo;
		this.modelo.addObserver(this);
		this.contVent=contVent;
		
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(new Dimension(1000, 600));
		this.setSize(1050, 600);
		this.setContentPane(getJContentPane());
		this.setResizable(false);
		this.setTitle("Car Tunning Experience 2008");
		//this.addKeyListener(controlador.getKeyListener());
		//this.requestFocus();
		this.setVisible(true);
		this.addWindowListener(new CloseListener(contVent,modelo));
	}

	
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new GridLayout(1,3,1,1));
			jContentPane.add(getVistaJugador(),null);
			jContentPane.add(getVistaOponente(),null);
			jContentPane.add(getPanelDatos(),null);
			
					
		}
		return jContentPane;
	}

	private JPanel getPanelDatos() {
		if (panelDatos == null){
			panelDatos = new JPanel();
			panelDatos.setLayout(new GridLayout());
			panelDatos.add(getVistaDatos());
		}
		return panelDatos;
	}

	private JTextArea getVistaDatos() {
		if (vistaDatos == null){
			vistaDatos = new VistaDatos(modelo,controlador);
		
		}
		return vistaDatos.getVista();
	}

	private PanelPista getVistaOponente() {
		if (VistaOponente == null) {
			VistaOponente = new PanelPista();
			VistaOponente.setLayout(new GridBagLayout());
			Border borderLine = BorderFactory.createLineBorder(Color.DARK_GRAY);
			VistaOponente.setBorder(borderLine);
								
		}
		return VistaOponente;
	}

	private PanelPista getVistaJugador() {
		if (VistaJugador == null) {
			VistaJugador = new PanelPista();
			VistaJugador.setLayout(new GridBagLayout());
			Border borderLine = BorderFactory.createLineBorder(Color.DARK_GRAY);
			VistaJugador.setBorder(borderLine);
								
		}
		return VistaJugador;
	}

	public void update(Observable arg0, Object arg1) {
		Auto aj= (Auto)modelo.getVehiculoJugador();
		Auto ao= (Auto)modelo.getVehiculoOponente();
		double rj=aj.getRecorrido()*500/modelo.getPistaActual().getLongitud();
		double ro=ao.getRecorrido()*500/modelo.getPistaActual().getLongitud();
		VistaJugador.redibujar((int)rj);
		VistaOponente.redibujar((int)ro);
	}
	
	public void VistaCarreraVisibilidadTrue(){
		this.setVisible(true);  
	}
	
	public void VistaCarreraVisibilidadFalse(){
		this.setVisible(false);  
	}

}  